在 RBAC 中有 4 個物件:
在 default 的 namespace 下建立 role,一個 role 可以有多個 rules
。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: developer
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
resources: ["deployments"]
verbs: ["get", "list", "update"]
resourceNames: ["new-deployment"] # 限制名稱為 new-deployment 的 deployment
apiVersion
:RBAC 使用的 api version 為 rbac.authorization.k8s.io/v1
namespace
:指的是在 namespace 為 default 的該資源apiGroups
:空白指 core API group,或指定 group 名稱,如 example.com
resource
:授權的資源,如 pods、deployments 或 jobs,*
表示所有資源verbs
:可對資源進行何種操作,如 create (kubectl create -f pods.yaml
) 取得 pods 資訊透過 rolebinding 將 user 連接 role。以下是 user-1
有 developer
的權限,在 default
namespace 中進行 get pod、list、create 等操作,及可對 deployments 執行 get、list、update 動作。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: default
name: dev-user-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: developer
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: user-1
namespace
:defaultroleRef
kind
:Role
或 ClusterRole
name
:要 binding 的物件名稱subjects
:可以有一個或多個 users
name
:名稱有分大小寫建立 role。
kubectl create -f dev-role.yaml
建立 roleBinding。
kubectl create -f dev-role-binding.yaml
另一種方式是透過以下指令建立 roleBinding。
kubectl create rolebinding dev-user-binding --role=developer --user=user-1
檢查自己有沒有被指定到該 role。
kubectl auth can-i list deployments --as developer
或是檢查其他 user 則使用以下指令。
kubectl list deployments --as user-1
對 node 來說不會僅限於某 namespace 中,node 是在叢集中存取(cluster-scope)的。也就是說資源可以分為以 namespace 存取、不能以 namespace 劃分(叢集範圍)存取兩種。
叢集範圍類別的資源包含:node、persistent volume、namespace、clusterroles 與 clsuterrolebindings 等。
若要查看 k8s 的資源可以透過
kubectl api-resources
指令,會標示資源的namespace
為true
或false
。
而 clusterRole 與 clusterRolebindings 就是賦予 user 叢集範圍資源的權限。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
或是透過以下指令。
kubectl create clusterrole secret-reader --resource=secrets --verb=get,watch,list
manager
群組,使該群組可以讀取任何 namespace 下的 secrets。apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: secrets-user-cluster-role-binding
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io
或是透過以下指令。
kubectl create clusterrolebinding secrets-user-cluster-role-binding --clusterrole=secret-reader --user=manager
檢查有沒有設定成功。
kubectl get secrets --as manager
ClusterRole 也可以與 rolebinding 一起使用,因 rolebinding 是可以限制在某 namespace 中,故會變成該 namespace 下的 user 可以擁有叢集範圍資源的存取權限。